
package com.jf.cloud.seckill.service;

import com.jf.cloud.seckill.dto.SeckillSkuDTO;
import com.jf.cloud.seckill.vo.SeckillSkuVO;

import java.util.List;

/**
 * 秒杀活动sku
 *
 * @author zz
 * @date 2021-03-30 14:53:09
 */
public interface SeckillSkuService {

    /**
     * 根据秒杀活动skuid获取秒杀活动sku
     *
     * @param seckillSkuId 秒杀活动skuid
     * @return 秒杀活动sku
     */
    SeckillSkuVO getBySeckillSkuId(Long seckillSkuId);

    /**
     * 根据秒杀活动id获取秒杀商品规格信息
     * @param seckillId 秒杀活动id
     * @return 秒杀商品规格信息
     */
    List<SeckillSkuVO> listSeckillSkuBySeckillId(Long seckillId);

    /**
     * 批量保存秒杀活动sku
     * @param seckillSkuList 秒杀活动sku
     */
    void saveBatch(List<SeckillSkuDTO> seckillSkuList);

    /**
     * 清除秒杀sku信息
     * @param seckillId 秒杀id
     */
    void removeSeckillSkuCacheBySeckillId(Long seckillId);

    /**
     * 缓存分片信息
     * @param seckillSkuId
     * @param totalStock
     * @return availableZone
     */
    Integer doZone(Long seckillSkuId, Integer totalStock);

    /**
     * 根据秒杀skuId从redis获取库存
     * @param seckillSkuId
     * @return
     */
    Integer getStockBySeckillSkuId(Long seckillSkuId);

    /**
     * 根据秒杀Id从redis获取库存
     * @param seckillId
     * @return
     */
    Integer getStockBySeckillId(Long seckillId);

    /**
     * 获取可用zone数量（有可能缓存会被删除）
     *
     * @param seckillSkuId 秒杀skuId
     * @param skuId
     * @param activityId
     * @return
     */
    Integer getAvailableZone(Long seckillSkuId, Long skuId, Long activityId);

    /**
     * 获取可能需要落库的秒杀活动
     * @return 秒杀信息
     */
    List<SeckillSkuVO> listMaybeNeedStockPlacementActivity();

    /**
     * 库存落库将缓存中的库存写入到数据库中
     * @param seckillSkuId
     * @param seckillId
     */
    void flushStockToDb(Long seckillSkuId, Long seckillId);

    /**
     * 获取刚刚结束的秒杀活动
     * @return
     */
    List<SeckillSkuVO> listOverJustNow();

    /**
     * 回退秒杀库存
     * @param activityId
     * @param skuId
     * @param count
     */
    void rollbackSecKillStock(Long activityId,
                              Long skuId,
                              Integer count);
}
